/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include <UI/UI.h>
#include "框架/屏幕.h"




class C_3D场景视口 : public C_Widget {

public:
	C_3D场景视口(S_UI渲染环境& ctx);
	~C_3D场景视口();


	uint32			m_背景;
	uint32			m_背景_选框;
	uint32			m_小组件绘制_背景;

	S_Surface2D*	m_背景_线;
	
	std::vector<vec2> m_参考线坐标;



	C_Widget* ui_三维视口;
	C_Widget* ui_坐标组件;
	C_Widget* ui_操作图形层;
	
	C_Widget* ui_移动视口组件;
	C_Widget* ui_透视模式组件;
	
	C_属性栏* ui_属性栏;
	C_状态条* ui_状态条;
	
	S_Props m_透视模式;
	S_Props m_数值输入显示;
	S_Props m_物体显示模式;


	bool	m_是否开启视线旋转物体;
	float32	m_旋转度;
	//vec2	m_辅助线段[2];

	static bool		g加选;
	static bool		g视口摄像机旋转;
	static bool		g鼠标左键是否按下;
	static uint8	g视口摄像机平移;
	float32			m_方向小组件_鼠标距离中心距离;
	int32			m_方向小组件_选中的ID;

	static uint8 g_移动视口_鼠标左键;
	static uint8 g_移动视口_键盘按键;
	static uint8 g_移动视口_鼠标中键;

	S_物体*			m_变换手柄;

	static std::set<C_3D场景视口*> gui_3D视口;

	//ivec2	m_帧区;
	//int32	m_当前帧;
	//void	f_刷新时间帧绘制();
	float32	f_旋转辅助线绘制(vec2 鼠标开始位置, vec2 鼠标当前位置);
	float32	f_缩放辅助线绘制(vec2 鼠标开始位置, vec2 鼠标当前位置);

	void	f_关闭虚拟线绘制();
	void	f_设置渲染方式(uint8 id);
	void	f_更新方向组件(const S_摄像机& camera);
	
};



void on_骨骼编辑操作模式切换(S_Props& prop);


void f_view3d_重构状态条(C_状态条* 状态条, C_Widget* 三维视口);
void f_view3d_重构属性栏(C_属性栏* plane, const std::set<S_物体*>& obs, C_Widget* 三维视口);
void f_view3d_更新属性栏();

bool f_view3d_射线选中物体(const vec3& s, const vec3& e, bool 多选物体, S_摄像机& camera, const S_Rect2Df& rect, const vec2& 鼠标位置);
bool f_view3d_射线选中网格元素(const vec3& s, const vec3& e, bool 多选物体, S_摄像机& camera);
bool f_view3d_射线选中骨骼元素(const vec3& s, const vec3& e, bool 多选物体, S_摄像机& camera);
bool f_view3d_射线选中曲线元素(const vec2& 鼠标位置, bool 多选物体, Mat44f 相机矩阵[3], const S_Rect2Df& rect, vec3& 中点);
bool f_view3d_框选物体(C_3D场景视口& view, vec2 鼠标开始位置, vec2 鼠标结束位置, bool 反选, E_键位执行状态 阶段);

bool f_view3d_物体编辑模式_键盘事件(const S_键盘& ks);
bool f_view3d_骨骼编辑模式_键盘事件(C_Widget* self, const S_键盘& ks, S_UI渲染环境& ctx, S_摄像机* camera);

void f_view3d_设置激活物体焦点(bool 激活);
bool f_view3d_创建物体菜单(C_Widget* self, const std::u16string name, uint16 id);
bool f_view3d_删除物体菜单(C_Widget* self, const std::u16string name, uint16 id);


void f_view3d_切换物体线显示();

void f_view3d_缩放所有视口变换手柄();

void f_view3d_置变换手柄变换(S_Tranform t);

E_事件是否传递 on_3D视口_拖动(C_Widget* self, const S_鼠标& 鼠标, S_拖放数据& data);
//void f_3D视口_选框拖动(C_3D场景视口* view, const vec2& 鼠标位置);


E_事件是否传递 f_view3d_挤出(C_Widget* self, uint8 状态);



void f_3dView_置摄像机视点偏移(vec3 中心);

vec3 f_3dView_平面空间坐标(const S_摄像机& camera, vec2 屏幕坐标, vec3 平面偏移坐标, const S_Rect2Df& rect);
vec2 f_3dView_屏幕坐标转相机偏移(const S_摄像机& camera, vec2 屏幕坐标, vec3 平面偏移坐标, const S_Rect2Df& rect);



Inline vec2 f_view3d_get平面鼠标位置(C_Widget* self) {
	auto pos = f_widget_get鼠标局部位置(C_Widget::g_鼠标.gPos, self);
	pos.y = self->m_Size.y - pos.y;
	return pos;
}




E_事件是否传递 f_工作区_移动摄像机(C_Widget* self, E_键位执行状态 状态);
E_事件是否传递 f_工作区_旋转摄像机(C_Widget* self, E_键位执行状态 状态);
E_事件是否传递 f_工作区_推拉摄像机(C_Widget* self, E_键位执行状态 状态);


bool f_3dView_物体数值输入(C_Widget* self, const int8 c, uint8 flag);
void f_3dView_开关物体数值输入(C_3D场景视口& box, bool 打开);

